package cn.linran.pet.service.impl;

import cn.linran.basic.exception.BusinessException;
import cn.linran.basic.service.IBaiduAiAuditService;
import cn.linran.basic.util.CodeGenerateUtils;
import cn.linran.basic.util.DistanceUtils;
import cn.linran.basic.util.PageList;
import cn.linran.basic.util.Point;
import cn.linran.org.domain.Employee;
import cn.linran.org.domain.Shop;
import cn.linran.org.mapper.EmployeeMapper;
import cn.linran.org.mapper.ShopMapper;
import cn.linran.order.domain.OrderPetAcquisition;
import cn.linran.pet.domain.Pet;
import cn.linran.pet.domain.SearchMasterMsg;
import cn.linran.pet.domain.SearchMasterMsgAuditLog;
import cn.linran.pet.dto.AcceptDto;
import cn.linran.order.mapper.OrderPetAcquisitionMapper;
import cn.linran.pet.mapper.PetMapper;
import cn.linran.pet.mapper.SearchMasterMsgAuditLogMapper;
import cn.linran.pet.mapper.SearchMasterMsgMapper;
import cn.linran.pet.query.SearchMasterMsgQuery;
import cn.linran.pet.service.ISearchMasterMsgService;
import cn.linran.basic.service.impl.BaseServiceImpl;
import cn.linran.user.domain.User;
import cn.linran.user.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;

/**
 * 业务实现类：
 */
@Service
public class SearchMasterMsgServiceImpl extends BaseServiceImpl<SearchMasterMsg> implements ISearchMasterMsgService {
    @Autowired
    private SearchMasterMsgMapper searchMasterMsgMapper;

    @Autowired
    private UserMapper userMapper;

    @Autowired
    private ShopMapper shopMapper;

    @Autowired
    private IBaiduAiAuditService baiduAiAuditService;

    @Autowired
    private SearchMasterMsgAuditLogMapper searchMasterMsgAuditLogMapper;

    @Autowired
    private EmployeeMapper employeeMapper;

    @Autowired
    private OrderPetAcquisitionMapper orderPetAcquisitionMapper;

    @Autowired
    private PetMapper petMapper;
    /**
     * 存储发布信息
     * @param smm
     * @param id
     */
    @Override
    public void publish(SearchMasterMsg smm, Long id) {
        //1.先将userId、shopId添加到ssm对象中，然后保存到数据库t_searchMasterMsg   state:0 待审核
        // 1.1通过logininfoid查询userid
        User user = userMapper.loadByLogininfoId(id);
        //存userId
        smm.setUserId(user.getId());

        // 1.2 调用工具类得到宠物地址的point，再调用工具类通过point和所有商铺地址找到距离宠物最近的地址
        // 获取当前地址的point
        Point point = DistanceUtils.getPoint(smm.getAddress());
        // 调用工具类查询最近的店铺
        Shop nearestShop = DistanceUtils.getNearestShop(point, shopMapper.loadAll());
        //存shopId
        smm.setShopId(nearestShop.getId());
        // 1.3 存入寻主信息
        searchMasterMsgMapper.save(smm);

        //2. 审核（审核文本和图片通过百度智能审核）
        // 审核文本
        Boolean textBoolean = baiduAiAuditService.textAudit(smm.getTitle()+smm.getName() + smm.getAddress() + smm.getCoatColor());

        // 审核图片
        Boolean imgBoolean = baiduAiAuditService.imageAudit(smm.getResources());

        if(textBoolean && imgBoolean){// 2.1审核通过

            // 2.1.1 修改状态
            smm.setState(1);
            smm.setNote("待处理");
            searchMasterMsgMapper.update(smm);

            // 2.1.2 添加审核日志
            SearchMasterMsgAuditLog smmal= new SearchMasterMsgAuditLog();
            smmal.setMsgId(smm.getId());
            smmal.setState(1);
            smmal.setAuditTime(new Date());
            smmal.setNote("待处理状态！");

            // 保存审核日志信息
            searchMasterMsgAuditLogMapper.save(smmal);
            // 短信， 邮箱。

        }else{ // 2.2 审核失败
            // 2.2.1 修改状态     note
            smm.setNote("驳回，信息异常");
            searchMasterMsgMapper.update(smm);
            // 2.2.2 添加审核日志
            SearchMasterMsgAuditLog smmal= new SearchMasterMsgAuditLog();
            smmal.setMsgId(smm.getId());
            smmal.setState(0);
            smmal.setAuditTime(new Date());
            smmal.setNote("审核不通过，驳回，信息异常！");
            // 保存审核日志信息
            searchMasterMsgAuditLogMapper.save(smmal);
            throw new BusinessException("信息异常，请重新录入");
        }
    }

    /**
     * 待处理分页实现
     * @param query
     * @param id
     * @return
     */
    @Override
    public PageList<SearchMasterMsg> toHandle(SearchMasterMsgQuery query, Long id) {
        // 通过logininfoid查询employee（当前处理寻主信息的登陆人）
        Employee emp = employeeMapper.loadByLogininfoId(id);
        // 设置成待处理状态
        query.setState(1);
        if(emp.getShop_id()!=null){//如果员工所属商店不为空
            query.setShopId(emp.getShop_id());//将商店id设置进查询条件
        }
        return super.pageQuery(query);
    }

    /**
     * 拒单
     * @param id
     */
    @Override
    public void reject(Long id) {
        //将拒接id传到SQL，将次信息state设置为0
        searchMasterMsgMapper.reject(id);
    }

    /**
     * 接单
     *  0.根据smmid查询订单，如果查的到，该订单正在处理中，
     *  1.生成一个pet : 根据searchMasterMsg生成。
     * 	2.生成一个收购订单：
     * 	3.保存订单
     * @param dto
     * @param id
     */
    @Override
    public void accept(AcceptDto dto, Long id) {
        Long msgId = dto.getMsgId();//前端传来的smmid

        // 0.根据smmid查询订单，如果查的到，该订单正在处理中，
        OrderPetAcquisition order = orderPetAcquisitionMapper.loadBySmmId(msgId);
        if(order!=null){ // 之前接单了
            throw  new BusinessException("订单正在处理中。。。！");
        }

        //  1.生成一个pet : 根据searchMasterMsg生成。
        //1.1通过msgId查询到smm对象
        SearchMasterMsg searchMasterMsg = searchMasterMsgMapper.loadById(msgId);
        //1.2通过smm对象创建pet对象
        Pet pet = searchMasterMsg2Pet(searchMasterMsg);
        // 1.3保存,自增主键id可以取到了
        petMapper.save(pet);

        // 2. 生成一个收购订单：
        OrderPetAcquisition opa = ininOrderPetAcquisition(dto,pet,searchMasterMsg);
        // 3. 保存订单
        orderPetAcquisitionMapper.save(opa);
    }

    /**
     * 通过searchMasterMsg 生成一个pet
     * @param smm
     * @return
     */
    private Pet searchMasterMsg2Pet(SearchMasterMsg smm) {
        //1.1创建pet对象
        Pet pet = new Pet();
        //1.2存入属性
        pet.setName(smm.getName()); //宠物名字
        pet.setCostprice(smm.getPrice()); //宠物价格
        pet.setType_id(smm.getPetType()); //宠物类型
        pet.setResources(smm.getResources()); //宠物资源路径
        pet.setShop_id(smm.getShopId()); //宠物最近商店
        pet.setSearch_master_msg_id(smm.getId()); //宠物寻主信息id
        //1.3返回一个宠物对象
        return pet;
    }
    /**
     * 生成一个订单对象
     * @param dto
     * @param pet
     * @return
     */
    private OrderPetAcquisition ininOrderPetAcquisition(AcceptDto dto, Pet pet,SearchMasterMsg smm) {

        // 1.1创建一个订单对象，赋值
        OrderPetAcquisition order = new OrderPetAcquisition();

        // 1.2随机生成一个订单编号（需要工具类CodeGenerateUtils）
        order.setOrderSn(CodeGenerateUtils.generateOrderSn(smm.getUserId()));
        // 1.3存入摘要
        order.setDigest("【"+smm.getTitle()+"】");
        // 1.4最后确认时间 定时任务
        order.setLastcomfirmtime(new Date(System.currentTimeMillis()+2*24*60*60*1000));//48小时完成
        // 1.5存入其它属性
        order.setState(0);// 待处理
        order.setPrice(smm.getPrice());
        order.setPetId(pet.getId());
        order.setUserId(smm.getUserId());
        order.setShopId(smm.getShopId());
        order.setAddress(smm.getAddress());
        order.setEmpId(dto.getHandler()); //处理人 = 处理员工
        order.setSearchMasterMsgId(dto.getMsgId()); // 寻主信息id
        // 1.6返回一个订单对象
        return order;
    }

//    @Override
//    public PageList<SearchMasterMsg> user(SearchMasterMsgQuery query, Long id) {
//        // 查询到用户id
//        User user = userMapper.loadByLogininfoId(id);
//        query.setUserId(user.getId());  // <if userId！=null> and user_id=#{userId}<>
//
//        return super.pageQuery(query);
//    }
}
